//添加菜单,通过获取json生成html格式菜单
function addMenu() {
	var json=$('#tg').treegrid('getData');
	var str = "";
	$.each(json, function(i, item) {
		// 生成菜单
		str += menu(item, i);
		});
	// 将菜单加载到网页中
	$('#menu').html(str);
	// 网页生成后舒适化menu
	initMenu();
	}
// 生成单条菜单,由json生成html
function menu(item, i) {
	if (isUndefine(item.children)) {// 不存在子菜单,下面判断i是否定义是判断谁调用本函数的，是其他函数调用还是本函数内部自己调用生成子菜单的
		if (isUndefine(i)) {// i没定义，说明没有传递参数i，则生成的是子菜单，格式<a
							// href="http://www.soso.com/"><span>搜索</span></a>
			tmpStart = "<a href=\"";
			tmpMid="";
			tmpEnd = "</a>";
			}
		else{// i定义了，说明生成的是主菜单,主菜单格式<dl id="menu1"><dt><a
				// href="#V1001_TODAY_MUSIC">今日歌曲</a></dt><dd></dd>
			tmpStart = "<dl id=\"menu" + (i + 1) + "\"><dt><a href=\"";
			tmpMid="";
			tmpEnd = "</a></dt ><dd></dd></dl>";
			}
		tmp = tmpStart;
		if (item.type == "click") {// 如果是click事件，则以#标记
			tmp = tmp + "#" + item.value + "\">";
			}
		else{// 否则为view，直接显示url
			tmp = tmp + item.value + "\">";
			}
		tmp = tmp + tmpMid+item.name + tmpEnd;
		return tmp;
		}
	else{// 存在子菜单
		tmp = "";
		// 存在子菜单，遍历子菜单json数组,取出子菜单，取出后则不含子菜单标记了，menu(item)就会走上面的流程了
		$.each(item.children, function(j, item) {
			// 生成子菜单
			tmp += menu(item);
			});
		string = "<dl id=\"menu" + (i + 1)+ "\"><dt><a href=\"#\">" + item.name+ "</a></dt><dd>" + tmp + "</dd></dl>";
		return string;
		}
	}
// 判断元素是否存在或者定义,否返回true
function isUndefine(exp) {
	if (typeof (exp) == "undefined") {
		return true;
		}
	else {
		return false;
		}
	}
// 初始化菜单的样式
function initMenu() {
	for ( var _dl = document.getElementById("menu").getElementsByTagName("dl"), i = -1, dl; dl = _dl[++i];) {
		var dt = dl.getElementsByTagName("dt")[0];
		var dd = dl.getElementsByTagName("dd")[0];
		dt.onmouseover = function() {MouseOverMenu(this);return ShowMenu(this, 1);};
		dt.onmouseout = dd.onmouseout = function() {return ShowMenu(this, -1);};
		dd.onmouseover = function() {return cancelHide(this);};
		}
	}
function ShowMenu(obj, d) {
	var dt = obj.parentNode;
	var dd = dt.getElementsByTagName("dd")[0];
	clearInterval(dd.timer);
	if (d == 1) {
		clearTimeout(dt.timer);
		if (dd.maxh && dd.maxh == dd.offsetHeight) {
			return;
			}
		else if(!dd.maxh){
			dd.style.top = '-' + dd.offsetHeight + 'px';
			dd.style.display = "block";
			dd.maxh = dd.offsetHeight;
			dd.style.height = '0px';
			}
		dd.timer = setInterval(function() {ddSlide(dd, 1);}, 15);
		}else{
			dt.timer = setTimeout(function() {ddCollapse(dd);}, 50);
			}
	}
function ddCollapse(c) {
	c.timer = setInterval(function() {ddSlide(c, -1);}, 15);
	}
function cancelHide(obj) {
	var dt = obj.parentNode;
	var dd = dt.getElementsByTagName("dd")[0];
	clearTimeout(dt.timer);
	clearInterval(dd.timer);
	if (dd.offsetHeight != dd.maxh) {
		dd.timer = setInterval(function() {ddSlide(dd, 1);}, 15);
		}
	}
function ddSlide(c, d) {
	var currh = c.offsetHeight;
	var h = (d != 1 ? (Math.ceil(currh / 10)) : (Math.ceil((c.maxh - currh) / 10)));
	var t = parseInt(c.style.top);
	if (h < 0 && d == 1) {
		h = 1;
		}
	c.style.top = t - parseInt(h * d) + 'px';
	c.style.height = currh + (h * d) + 'px';
	if ((currh == 0 && d == -1) || (currh == c.maxh && d == 1))
		clearInterval(c.timer);
	}


// 通过html获取菜单的json格式
function getMenusJson() {
	// menu
	var menu = {};
	// menu包含的数组
	var json = [];
	// 菜单项的个数
	var len = $("dl").length;
	for (var i = 0; i < len; i++) {
		// 取出菜单项中所有的标签
		var target = $("dl")[i].getElementsByTagName('a');
		
		var leng = target.length;
		// 所有的标签页中，0为主菜单，0以后为子菜单，如果长度大于1说宁存在子菜单
		if (leng > 1) {
			var tmp = {};
			tmp["name"] = target[0].text;
			tmp["sub_button"] = getSubMenus(target).sub_button;
			json.push(tmp);
		} else {
			json.push(getMenuJson(target[0]));
		}
	}
	menu["button"] = json;
	return menu;
}

// 获取子菜单
function getSubMenus(target) {
	var subMenu = {};
	var json = [];
	var len = target.length;
	// i=0为主菜单，子菜单从1开始
	for (var i = 1; i < len; i++) {
		var tmp = getMenuJson(target[i]);
		json.push(tmp);
	}
	subMenu["sub_button"] = json;
	return subMenu;
}

// 获取菜单的json形式
function getMenuJson(target) {
	var tmp = {};
	tmp["name"] = target.text;
	content = target.href;
	// content.startsWith("http")不能用作判断，因为#开头的浏览器会补齐当前网页，自动添加http开头的网址
	if (content.contains("#")) {
		tmp["type"] = "click";
		tmp["key"] = getKey(content);
	} else {
		tmp["type"] = "view";
		tmp["url"] = content;
	}

	return tmp;
}

// 获得click菜单的key值
function getKey(content) {
	if(content.contains("#"))
	{// 找到#标记，取#以后的值为key
		startIndex = content.indexOf("#") + 1;
		return content.substring(startIndex);
	}else{
		return content;
	}

}

// 获鼠标滑过菜单事件
function MouseOverMenu(target) {
	var tmp=target.getElementsByTagName("a")[0];
	json=$('#tg').treegrid('getData');
	id=getTreeIdByName(json, tmp.text);
	$('#tg').treegrid('select',id);
	// 如果是主菜单就展开
	if(getKey(tmp.href).length==0){
		$('#tg').treegrid('expand',id);
	}

	/*
	 * if(tmp.href.contains("#")) {// 包含#为click事件,或者包含子菜单
	 * if(getKey(tmp.href).length==0) {// 如果#后为空则包含子菜单
	 * $.each(target.nextSibling.children, function(i,
	 * item){console.log("鼠标选中菜单"+tmp.text+"----子菜单"+item.text+getKey(item.href));});
	 * }else{// 如果#后不为空,不是子菜单则为key
	 * console.log("鼠标选中菜单"+tmp.text+getKey(tmp.href)); } } else {//
	 * 为view事件,不可能包含子菜单 console.log("鼠标选中菜单"+tmp.text+tmp.href); }
	 */
	 
}

// 通过那么查找treemenu的ID
function getTreeIdByName(json, name) {
	var id;
	$.each(json,function(i, item) {
		if (item.name == name) {
			id=item.id;
			return false;
			}
		if(!isUndefine(item.children)){
			$.each(item.children,function(i, item) {
				if (item.name == name) {
					id=item.id;
					return false;
					}
				});
			}
		});
	return id;
	}

// 更新菜单
function updateMenu() {
	slide('提示', '正在更新菜单，请稍等!');
	var json=getMenusJson();
	$.post('../servlet/UpdateMenu',JSON.stringify(json),function(data){
		if(data=="0"){
			slide('提示', '菜单更新成功!');
			}else{
				alert("菜单更新错误,错误代码: "+data);
			}
	   },"text");
	
}

// treegrid父框体div的右键菜单事件
function onDivContextmenu(e) {
	e.preventDefault();
	// 取消treegrid中的选择,以方便添加菜单中确定按钮判断右键菜单是在treegrid离发生的还是div中
	$('#tg').treegrid('unselectAll');
	// 显示菜单
	$('#divMenu').menu('show', {
		left : e.pageX,
		top : e.pageY
	});
}

// 保存编辑列的id
var editingId;
function treeEdit(){
	if (editingId != undefined){
		$('#tg').treegrid('select', editingId);
		return;
	}
	var row = $('#tg').treegrid('getSelected');
	if (row){
		editingId = row.id;
		$('#tg').treegrid('beginEdit', editingId);
	}
}
function treeSave(){
	if (editingId != undefined){
		var t = $('#tg');
		t.treegrid('endEdit', editingId);
		editingId = undefined;
		// 刷新菜单视图
		addMenu();
	}
}
function treeCancle(){
	if (editingId != undefined){
		$('#tg').treegrid('cancelEdit', editingId);
		editingId = undefined;
	}
}